package ch03;

import ch02.Node;

public class LinkStack implements IStack{//这是链栈类
    private Node top;   //栈顶元素的引用

    //将栈置空
    public void clear() {
        top = null;
    }

    //判断栈是否为空
    public boolean isEmpty() {
        return  top == null;
    }

    //求链栈的长度
    public int length() {
        Node p = top;  //初始化，p指向栈顶元素，length为计数器
        int length = 0;
        while (p != null) {  //从栈顶元素开始向后查找，直到p指向空
            p = p.next;   //p指向后继结点
            ++length;//长度增加1
        }
        return length;
    }

    //取栈顶元素并返回其值
    public Object peek() {
        if (!isEmpty())   //栈非空
            return top.data;   //返回栈顶元素的值
        else
            return null;
    }

    //入栈
    public void push(Object x){
        Node p = new Node(x);    //构造一个新结点
        p.next = top;
        top = p;  //新结点成为当前的栈顶结点
    }

    //出栈
    public Object pop() {
        if (isEmpty()) {
            return null;
        }
        else {
            Node p = top;  //p指向被删除结点（栈顶结点）
            top = top.next;  //修改链指针，使栈顶结点从链栈中移去
            return p.data;   //返回栈顶结点的数据域的值
        }
    }

    //输出栈中所有数据元素（从栈顶元素到栈底元素）
    public void display() {
        Node p = top;  //初始化，p指向栈顶元素
        while (p != null){   //输出所有非空结点的数据元素值
            System.out.print(p.data.toString() + " ");
            p = p.next;   //p指针向后移
        }
    }
 }
